package org.goodsmanager.mapper;

import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;
import org.goodsmanager.entity.Product;
import java.util.List;
import java.util.Map;

/**
 * 商品Mapper接口
 *
 * @author Goods Manager System
 * @version 1.0.0
 */
@Mapper
public interface ProductMapper {

    /**
     * 插入商品
     */
    int insert(Product product);

    /**
     * 根据ID删除商品
     */
    int deleteById(String id);

    /**
     * 批量删除商品
     */
    int batchDelete(@Param("ids") List<String> ids);

    /**
     * 更新商品
     */
    int update(Product product);

    /**
     * 根据ID查询商品
     */
    Product selectById(String id);

    /**
     * 查询所有商品
     */
    List<Product> selectAll();

    /**
     * 分页查询商品
     */
    List<Product> selectByPage(@Param("offset") int offset,
                               @Param("pageSize") int pageSize,
                               @Param("keyword") String keyword,
                               @Param("categoryId") String categoryId,
                               @Param("status") Integer status,
                               @Param("minPrice") Double minPrice,
                               @Param("maxPrice") Double maxPrice,
                               @Param("sortBy") String sortBy,
                               @Param("sortOrder") String sortOrder);

    /**
     * 查询总记录数
     */
    int countAll(@Param("keyword") String keyword,
                 @Param("categoryId") String categoryId,
                 @Param("status") Integer status,
                 @Param("minPrice") Double minPrice,
                 @Param("maxPrice") Double maxPrice);

    /**
     * 根据商品编码查询
     */
    Product selectByCode(String productCode);

    /**
     * 检查商品编码是否存在
     */
    int checkCodeExists(@Param("productCode") String productCode,
                        @Param("excludeId") String excludeId);

    /**
     * 更新商品库存
     */
    int updateStock(@Param("id") String id,
                    @Param("quantity") int quantity);

    /**
     * 增加浏览次数
     */
    int increaseViewCount(String id);

    /**
     * 增加销售数量
     */
    int increaseSalesCount(@Param("id") String id,
                           @Param("quantity") int quantity);

    /**
     * 查询热销商品（Top N）
     */
    List<Product> selectHotProducts(@Param("limit") int limit);

    /**
     * 查询新品商品
     */
    List<Product> selectNewProducts(@Param("limit") int limit);

    /**
     * 查询库存不足的商品
     */
    List<Product> selectLowStockProducts();

    /**
     * 根据分类ID查询商品
     */
    List<Product> selectByCategoryId(String categoryId);

    /**
     * 批量更新商品状态
     */
    int batchUpdateStatus(@Param("ids") List<String> ids,
                          @Param("status") Integer status);

    /**
     * 获取商品统计信息
     */
    Map<String, Object> getStatistics();

    /**
     * 按分类统计商品数量
     */
    List<Map<String, Object>> countByCategory();

    /**
     * 查询价格区间的商品
     */
    List<Product> selectByPriceRange(@Param("minPrice") Double minPrice,
                                     @Param("maxPrice") Double maxPrice);

    /**
     * 搜索商品（支持多字段模糊查询）
     */
    List<Product> searchProducts(@Param("keyword") String keyword,
                                 @Param("offset") int offset,
                                 @Param("pageSize") int pageSize);

    /**
     * 统计搜索结果数量
     */
    int countSearchResults(@Param("keyword") String keyword);

    /**
     * 查询所有分类ID
     */
    List<String> selectAllCategoryIds();
    
    /**
     * 查询推荐商品（首页展示）
     */
    List<Product> selectRecommendedProducts(@Param("limit") int limit);
    
    /**
     * 查询促销商品
     */
    List<Product> selectPromotionProducts(@Param("limit") int limit);
    
    /**
     * 查询相关商品（基于商品分类）
     */
    List<Product> selectRelatedProducts(@Param("categoryId") String categoryId,
                                       @Param("excludeProductId") String excludeProductId,
                                       @Param("limit") int limit);
    
    /**
     * 根据分类ID统计商品数量
     */
    int countByCategory(@Param("categoryId") String categoryId);
    
    /**
     * 根据分类ID查询商品列表
     */
    List<Product> selectByCategory(@Param("categoryId") String categoryId,
                                   @Param("limit") int limit);
    
    /**
     * 获取商品搜索建议
     */
    List<String> selectProductSuggestions(@Param("keyword") String keyword,
                                          @Param("limit") int limit);
}